iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
0

Django 在建立新專案以後,本身就有帳號驗證,只是有這些缺點:

  1. 想要改用電子郵件作為帳號名稱的話,需要自己修改 (參考 Substituting a custom user model)
  2. 登入、登出、忘記密碼等頁面都要自己寫。

django-authtools 最主要就是解決以上問題,在安裝 django-authtools 以後,你可以有:

  1. 預先定義好的 model ,可以直接使用電子郵件作為帳號
  2. 提供新的 model 的 admin 介面。
  3. 註冊與登入的表單 (Form)
  4. 預先寫好的註冊、登入、登出、變更密碼等頁面 (View)
  5. 提供不檢查大小寫的驗證後端 (Authentication Backend)

使用 django-authtools 可以讓新專案省事很多。

專案網址:https://django-authtools.readthedocs.io/en/latest/

安裝

poetry add django-authtools

設定

# settings
INSTALLED_APPS = [
  # ...
  'authtools',
]
AUTH_USER_MODEL = 'authtools.User'

把 authtools 加到 INSTALLED_APPS 以後,執行 migrate

poetry run python manage.py migrate

在 urls 加入 authtools.urls

# urls.py
urlpatterns = patterns('',
    # ...
    url(r'^accounts/', include('authtools.urls')),
    # ...
)

使用

預先定義的 User model

django-authtools 提供 User 這個 model 可以直接使用,在 settings 裡指定 AUTH_USER_MODEL = "authtools.User" 就可以。

如果需要加新的欄位,可以使用 The User Profile pattern 的方式,新增 model 跟 User 作一對一關聯。當然,也可以自己繼承 django-authtools 提供的 AbstractEmailUser 跟 AbstractNamedUser 來添加新欄位。

from authtools.models import AbstractEmailUser

class User(AbstractEmailUser):
    full_name = models.CharField('full name', max_length=255, blank=True)
    preferred_name = models.CharField('preferred name',
        max_length=255, blank=True)

    def get_full_name(self):
        return self.full_name

    def get_short_name(self):
        return self.preferred_name

在上面的例子裡,就繼承了 AbstractEmailUser,並添加了 full_name, preferred_name 這兩個欄位。

Admin

因為有定義新的 model,所以就有對應的 admin 介面。

  • NamedUserAdmin
  • UserAdmin
  • StrippedUserAdmin
  • StrippedNamedUserAdmin

使用的方法很簡單,在註冊 admin 時,指定對應的 Admin 類別就可以,例如:

# Define the admin class
from django.contrib.auth import get_user_model
from authtools.admin import NamedUserAdmin

User = get_user_model()

class MyUserAdmin(NamedUserAdmin):
    pass

# Register the admin class with the associated model
admin.site.register(User, MyUserAdmin)

Form

django-authtools 提供了登入、變更密碼、註冊等頁面,為此,也定義了可以重複使用的 Form :

  • UserCreationForm:登入/註冊用表單,表單欄位有使用者名稱跟密碼
  • CaseInsensitiveUsernameFieldCreationForm:不檢查使用者名稱大小寫的表單
  • UserChangeForm:變更密碼用表單
  • AdminUserChangeForm:管理者變更密碼表單
  • FriendlyPasswordResetForm:重置密碼表單

Views

django-authtools 提供了這些頁面:

  • LoginView:登入頁面
  • LogoutView:登出頁面
  • PasswordChangeView:密碼變更頁面
  • PasswordChangeDoneView:密碼變更完成頁面
  • PasswordResetView:重置密碼頁面
  • PasswordResetDoneView:重置密碼完成頁面
  • PasswordResetConfirmView:密碼重置確認頁面
  • PasswordResetConfirmAndLoginView:密碼重置確認後重新登入頁面
  • PasswordResetCompleteView:密碼重置完成頁面

這些頁面的邏輯已經完整,網址也定義在 authtools.urls 裡了。

那麼要怎麼去客製化頁面呢?方法很簡單,就是在專案目錄下建立 authtools/templates/registration 資料夾,然後把客製化過的 html 放進這個資料夾就可以了,html 的名稱如下:

  • LoginView 對應的 html 名稱是 login.html
  • LogoutView 對應的 html 名稱是 logged_out.html
  • PasswordChangeView 對應的 html 名稱是 password_change_form.html
  • PasswordChangeDoneView 對應的 html 名稱是 password_change_done.html
  • PasswordResetView 對應的 html 名稱是 password_reset_form.html'
  • PasswordResetDoneView 對應的 html 名稱是 password_reset_done.html
  • PasswordResetConfirmView 與 PasswordResetConfirmAndLoginView 對應的 html 名稱是 password_reset_confirm.html
  • PasswordResetCompleteView 對應的 html 名稱是 password_reset_complete.html

Authentication Backends

Django 內建的帳號驗證,是會嚴格檢查字母大小寫的,如果你不需要檢查字母大小寫的話,可以在 settings 裡指定 AUTHENTICATION_BACKENDS 為 authtools.backends.CaseInsensitiveUsernameFieldModelBackend 。

# settings.py
AUTHENTICATION_BACKENDS = [
    'authtools.backends.CaseInsensitiveUsernameFieldModelBackend',
]

結語

回想起第一次弄 Django 專案的登入登出,因為還不熟,真的搞不清楚怎麼弄,參考了幾個專案才搞定。後來看到 django-edge ,用 django-edge 當作專案的樣板,裏面用到 django-authtools ,才知道有這麼方便的套件。


上一篇
26. easy-thumbnails
下一篇
28. Grappelli
系列文
加速你的 Django 網站開發 - Django 的好用套件30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言